커스텀 이벤트(CustomEvent and EventTarget)

✒️ 2025-05-08 00:08 내용 수정


참고 자료 : mdn web docs CustomEvent, mdn web docs CustomEvent Constructor, mdn web docs Creating and triggering events

사용 계기


생성자

new CustomEvnet(eventType);
new CustomEvnet(eventType, options);
// 태그 변수 생성
let tag = 'all';

// tag에 관한 커스텀 이벤트 생성
const event = new CustomEvent("tagChanged", {detail: tag});

이벤트 전송(EventTarget object)

참고 자료 : mdn web docs EventTarget, mdn web docs dispatchEvent

메서드 설명
EventTarget.addEventListener() EventTarget에 특정 이벤트 타입의 핸들러를 등록
EventTarget.removeEventListener() EventTarget에 등록된 이벤트 핸들러를 제거
EventTarget.dispatchEvent() 이벤트를 해당 EventTarget에 보냄
// 태그 변수 생성
let tag = 'all';
// tag에 관한 커스텀 이벤트 생성
const event = new CustomEvent("tagChanged", {detail: tag});

// 이벤트를 감지할 요소 생성
const container = document.createElement("div");
// event target에 커스텀 이벤트 전송
container.dispatchEvent(event);

적용 예시

  1. 태그 변수를 저장할 tag_filter.js을 생성하고, 이 파일에선 태그 변수 선언과 태그를 지정하는 setTag(), 태그를 불러오는 getTag() 메서드를 정의한다.
    • setTag()getTag()를 사용하여 tag에 직접 접근하지 않고 메서드를 통해 접근하도록 설정했다.
    • JavaScript의 변수이므로 브라우저를 새로고침하면 tag는 다시 초기값으로 설정된다.
  2. setTag() 메서드에서 새 태그를 지정할 때 document 요소에 CustomEventtagChanged 이벤트를 전송하도록 작성했다.
  3. setTag()getTag()export로 내보낸다.
// tag_filter.js

// 홈, 검색 페이지의 태그 관리 js
let tag = '전체';

// 태그 새로 지정
export function setTag(newTag) { 
    tag = newTag;
    // 커스텀 이벤트 지정
    document.dispatchEvent(new CustomEvent('tagChanged', {detail: tag}));
}

// 태그 가져오기
export function getTag() {
	return tag; 
}
  1. 태그 버튼을 만드는 JavaScript에서 tag_filter.jssetTag()를 가져온다.
  2. document에 등록된 <button class="tag_button"> 요소들을 가져오고, 버튼에 click 이벤트 리스너를 등록한다.
    • 버튼 클릭 시 버튼 내의 텍스트를 tag_filter.js에 있는 tag에 저장하도록 setTag()를 호출한다.
// button_list.js
import { setTag } from "./tag_filter.js";

const item_buttons = document.querySelectorAll(".tag_button");

// 버튼 배열에 동작 수행
item_buttons.forEach(btn => {
	// 버튼에 클릭 이벤트 리스너 등록
	btn.addEventListener("click", (e)=>{
		// 선택한 버튼의 태그 내용을 tag 변수에 저장
		setTag(e.target.textContent);
	});
});
  1. 이벤트 변화를 감지할 search.js에서 tag_filter.jsgetTag() 메서드를 가져온다.
  2. tag_filter()에서 documentCustomEvent를 받는 대상이므로, documenttagChanged 이벤트 리스너를 등록한다.
  3. getTag()로 현재 태그 내용을 가져와 콘솔로 출력한다.
// search.js
import { getTag } from "./tag_filter.js";

// 태그가 바뀌는 이벤트를 받으면 수행할 내용을 등록
document.addEventListener('tagChanged', function () {
    // 버튼으로 설정된 태그 가져오기
    const tag_filter = getTag();

	// 태그 확인
    console.log(tag_filter);
});

js_customevent 1.png